#ifndef _TAIIC_VSR_H
#define _TAIIC_VSR_H


#include "rknn_api.h"
#include "rk_defines.h"
#include "rk_debug.h"
#include "taiic_rknn.h"
#include <cmath>
#include <algorithm>

#define VSR_INPUT_WIDTH 32
#define VSR_INPUT_HEIGHT 384
#define VSR_INPUT_CHANNEL 4
#define VSR_INPUT_BATCH 1

#define LM_VSR_MODEL_PATH_34 "/oem/usr/model/lm_vsr_34.rknn"
#define LM_VSR_MODEL_PATH_300 "/oem/usr/model/lm_vsr_300.rknn"
#define VSR_MODEL_PATH_300 "/oem/usr/model/vsr_300.rknn"



#define INPUT_TYPE RKNN_TENSOR_UINT8
#define INPUT_LAYOUT RKNN_TENSOR_NHWC

// input [1,384,32,4]
// output [1,44]

typedef struct rkTOOLKIT_VSR_S
{
    char *modelPath;
    rknn_context context; //模型上下文
    rknn_input_output_num io_num; //模型输入输出信息，结构体

    rknn_tensor_attr input_attrs[1];  //模型属性
    rknn_tensor_attr output_attrs[1]; //模型输出属性

    rknn_tensor_mem *input_mems[1]; //模型输入
    rknn_tensor_mem *output_mems[1]; //模型输出
}VSR_TOOLKIT_MODEL_CTX_S;

int vsr_rknn_toolkit_config_init(VSR_TOOLKIT_MODEL_CTX_S *ctx);//init model
int vsr_rknn_toolkit_io_init(VSR_TOOLKIT_MODEL_CTX_S *ctx);//init input_output
int vsr_rknn_toolkit_data_refresh(VSR_TOOLKIT_MODEL_CTX_S *ctx, unsigned char* input_data);//updata input data
MODEL_RESULT_S vsr_rknn_toolkit_result_int8(VSR_TOOLKIT_MODEL_CTX_S *ctx);//get top result
MODEL_RESULT_S vsr_rknn_toolkit_result_int8_opt(VSR_TOOLKIT_MODEL_CTX_S *ctx);

MODEL_RESULT_S vsr_rknn_toolkit_result_float32(VSR_TOOLKIT_MODEL_CTX_S *ctx);//get top result);

void softmax_stab(const int8_t* input, float* output, int dataSize, const int zp, const float scale);

#endif //_TAIIC_VSR_H